package com.ztr.suanfa.hmac;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class HMACTest {

    public static void main(String[] args) {
        //1 获取秘钥结果
        String password = "z123456789";
        String marked = HMACTest1(password);
        System.out.println(marked);
    }

    /**
     * 生成秘钥（创建秘钥生成器对象）
     * 利用秘钥生成器生成秘钥
     * 生成秘钥Key的字节数组
     * 可以将秘钥字节数组转换成字符串
     * 使用秘钥、进行加密（获取算法对象）
     * 初始化
     * 更新原始内容
     * 加密，生成字节数组形式的加密结果
     * 将加密结果转换成字符串
     *
     * @param password
     * @return password
     */
    public static String HMACTest1(String password) {
        try {
            //秘钥生成器
            KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
            //生成秘钥
            SecretKey key = keyGen.generateKey();
            //生成秘钥数组
            byte[] keyByteArray = key.getEncoded();
            StringBuilder sb = new StringBuilder();
            for (byte b : keyByteArray) {
                sb.append(String.format("%02x", b));
            }
            System.out.println("打印秘钥内容：" + sb);
            //2使用秘钥，进行加密
            //获取算法对象
            Mac mac = Mac.getInstance("HmacMD5");
            //初始化
            mac.init(key);
            mac.update(password.getBytes());
            //加密（返回字节数组）
            byte[] resultByteArray = mac.doFinal();
            //把字节数组转换成字符串
            StringBuilder resultStr = new StringBuilder();
            for (byte b : resultByteArray) {
                resultStr.append(String.format("%02", b));
            }
            System.out.println(resultStr);
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            e.printStackTrace();
        }
        return password;
    }

    // 恢复秘钥的代码实现
    public static String HMACTest2(String password) {
        try {
            //秘钥生成器
            KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
            //生成秘钥
            SecretKey key = keyGen.generateKey();
            //生成秘钥数组
            byte[] keyByteArray = key.getEncoded();
            StringBuilder sb = new StringBuilder();
            for (byte b : keyByteArray) {
                sb.append(String.format("%02x", b));
            }
            System.out.println("打印秘钥内容：" + sb);
            //2使用秘钥，进行加密
            //获取算法对象
            Mac mac = Mac.getInstance("HmacMD5");
            //初始化
            mac.init(key);
            mac.update(password.getBytes());
            //加密（返回字节数组）
            byte[] resultByteArray = mac.doFinal();
            //把字节数组转换成字符串
            StringBuilder resultStr = new StringBuilder();
            for (byte b : resultByteArray) {
                resultStr.append(String.format("%02", b));
            }
            System.out.println(resultStr);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            throw new RuntimeException(e);
        }
        return password;
    }
}
